cssprovider: Have a section when parsing style properties
authorBenjamin Otte <otte@redhat.com>
Wed, 28 Oct 2015 18:35:23 +0000 (19:35 +0100)
committerBenjamin Otte <otte@redhat.com>
Wed, 28 Oct 2015 18:37:27 +0000 (19:37 +0100)
Signal handlers expect a section to be present, so provide them with
one.

New testcase included.

https://bugzilla.gnome.org/show_bug.cgi?id=757240

gtk/gtkcssprovider.c
testsuite/gtk/Makefile.am
testsuite/gtk/cssprovider.c [new file with mode: 0644]

index 18a2c9c12d9ad5ee5bdf5bbfd743b9f8d65cb9d7..50108c39e5342e6745c34207602245e577c4e404 100644 (file)
@@ -1740,7 +1740,11 @@ gtk_css_provider_get_style_property (GtkStyleProvider *provider,
                                                  val->section,
                                                  val->section != NULL ? gtk_css_section_get_file (val->section) : NULL,
                                                  val->value);
+                  if (!val->section)
+                    gtk_css_scanner_push_section (scanner, GTK_CSS_SECTION_VALUE);
                   found = _gtk_css_style_funcs_parse_value (value, scanner->parser);
+                  if (!val->section)
+                    gtk_css_scanner_pop_section (scanner, GTK_CSS_SECTION_VALUE);
                   gtk_css_scanner_destroy (scanner);
                  break;
                 }
index 9a3809e4f48ea6a7cbaf4f1f4ff641786fe9ec4f..517492a6c086a9273a7cc296f9f55db19225b51f 100644 (file)
@@ -41,6 +41,7 @@ TEST_PROGS +=                         \
        cellarea                \
        check-icon-names        \
        clipboard               \
+       cssprovider             \
        defaultvalue            \
        entry                   \
        expander                \
diff --git a/testsuite/gtk/cssprovider.c b/testsuite/gtk/cssprovider.c
new file mode 100644 (file)
index 0000000..5222620
--- /dev/null
@@ -0,0 +1,63 @@
+#include <gtk/gtk.h>
+
+static void
+assert_section_is_not_null (GtkCssProvider *provider,
+                            GtkCssSection  *section,
+                            const GError   *error,
+                            gpointer        unused)
+{
+  g_assert (section != NULL);
+}
+
+static void
+test_section_in_load_from_data (void)
+{
+  GtkCssProvider *provider;
+
+  provider = gtk_css_provider_new ();
+  g_signal_connect (provider, "parsing-error",
+                    G_CALLBACK (assert_section_is_not_null), NULL);
+  gtk_css_provider_load_from_data (provider, "random garbage goes here", -1, NULL);
+  g_object_unref (provider);
+}
+
+static void
+test_section_in_style_property (void)
+{
+  GtkCssProvider *provider;
+  GtkWidgetClass *widget_class;
+  GtkWidgetPath *path;
+  GParamSpec *pspec;
+  GValue value = G_VALUE_INIT;
+
+  provider = gtk_css_provider_new ();
+  g_signal_connect (provider, "parsing-error",
+                    G_CALLBACK (assert_section_is_not_null), NULL);
+  gtk_css_provider_load_from_data (provider, "* { -GtkWidget-interior-focus: random garbage goes here; }", -1, NULL);
+
+  widget_class = g_type_class_ref (GTK_TYPE_WIDGET);
+  pspec = gtk_widget_class_find_style_property (widget_class, "interior-focus");
+  g_assert (pspec);
+  path = gtk_widget_path_new ();
+  gtk_widget_path_append_type (path, GTK_TYPE_WIDGET);
+
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+  gtk_style_provider_get_style_property (GTK_STYLE_PROVIDER (provider), path, 0, pspec, &value);
+G_GNUC_END_IGNORE_DEPRECATIONS;
+
+  gtk_widget_path_unref (path);
+  g_type_class_unref (widget_class);
+  g_object_unref (provider);
+}
+
+int
+main (int argc, char *argv[])
+{
+  gtk_init (NULL, NULL);
+  g_test_init (&argc, &argv, NULL);
+
+  g_test_add_func ("/cssprovider/section-in-load-from-data", test_section_in_load_from_data);
+  g_test_add_func ("/cssprovider/section-in-style-property", test_section_in_style_property);
+
+  return g_test_run ();
+}